#ifndef C_DETECT_H
#define C_DETECT_H

#include "utypes.h"
#include "structs.h"
#include "vg.h"


/**
 * Esta função indica se um Hero está na posição final do nível.
 *
 * @param finish Rectangle que representa o ponto de saída do nível.
 * @param hero Hero a ser testado.
 *
 * @return Bool que indica se o Hero está no final do nível.
 */
Bool isAtFinish(Hero hero, Rectangle finish);

/**
 * Esta função indica se um Hero está a colidir com um Enemy.
 *
 * @param enemy inimigo a ser testado.
 * @param hero Hero a ser testado.
 *
 * @return Bool que indica se o Hero está a colidir com o Enemy.
 */
Bool isColidingEnemy(Hero hero, Enemy enemy);

/**
 * Esta função recebe um Hero e um char* bg, que é uma Sprite de colisão,
 * e indica se o Hero está a colidir com algum ponto dessa sprite.
 * 
 * @param hero objecto do tipo Hero que vai ser analisado
 * @param *bg objecto do tipo char que é a Sprite de colisão a ser analisada
 * @return Bool indica se o Hero está a colidir com algum ponto da Sprite
 */
Bool isColidingFloor(Hero hero, char *bg);

/**
 * Esta função recebe um Hero e um char* bg, que é uma Sprite de colisão,
 * e indica se o Hero tem alguma plataforma em cima.
 * 
 * @param hero objecto do tipo Hero que vai ser analisado
 * @param *bg objecto do tipo char que é a Sprite de colisão a ser analisada
 * @return Bool indica se o Hero tem um plataforma em cima.
 */
Bool isPlatformAbove(Hero hero, char *bg);

/**
 * Esta função recebe um Hero e um char* bg, que é uma Sprite de colisão,
 * e indica se o Hero tem alguma plataforma em baixo.
 * 
 * @param hero objecto do tipo Hero que vai ser analisado
 * @param *bg objecto do tipo char que é a Sprite de colisão a ser analisada
 * @return Bool indica se o Hero tem um plataforma em baixo.
 */
Bool isPlatformBelow(Hero hero, char *bg);

/**
 * Esta função indica se uma pedra está a colidir com alguma plataforma do nível.
 *
 * @param stone Stone a ser testada.
 * @param bg char* que é uma Sprite de colisão do nível.
 *
 * @return Bool que indica se a pedra está a colidir com alguma plataforma.
 */
Bool isStoneCollidingBg(Stone stone, char* bg);

/**
 * Esta função indica se uma pedra está a colidir com algum inimigo.
 *
 * @param stone Stone a ser testada.
 * @param enemy Enemy a ser testado.
 *
 * @return Bool que indica se a pedra está a colidir com algum inimigo.
 */

Bool isStoneCollidingEnemy(Stone stone, Enemy enemy);

#endif
